Programme zwischen Banks ausführen...

← Zurück zum Forum

Hallöle, ich wollte hier mal ein Problem diskutieren, was mich im aktuellen Projekt schon lange beschäftigt und auch schon diverse Abstürze und schlaflose Nächte gekostet hat... es wird aber nur diejenigen interessieren, die verschiedene Banks benutzen.

Hintergrund: CavernsOfEris nutzt neben RAM unter ROM auch alle Banks. Normalerweise ist Bank 0 aktiv, die liegt zwischen $4000 und $7fff - nutzt man die übrigen Banks nicht, dann kann man hier ohne Einschränkung den Speicher $4000-$7FFF mit Programmcode betreiben. Braucht man die anderen Banks, dann schaltet man ja die jeweiligen Banks im Bereich $4000-$7FFF aktiv und der Code z.B. in Bank 0 wird ausgeblendet. Der ist quasi weg... bis man die Bank 0 wieder anschaltet. Bei einem Atari 130 XE kann ich also nur partiell auf die 81920 Bytes zugreifen, 65536 Bytes sind quasi immer ausgeblendet.

Jetzt könnte es mal notwendig sein, daß ein gerade ausgeführter Code in Bank3 (diese ist gerade eingeblendet) auf einen Code in Bank0 zugreifen will - z.B. mit einem JSR - danach soll der Code in Bank3 nach Ausführung des Codes in Bank0 weiterlaufen... das geht natürlich nicht, da sich der Rechner im Nirwana verliert, wenn ich die Bank3 abschalte und Bank0 einschalte und dann noch den JSR von Bank3 aus in Bank0 ausführen möchte!! Was tun? Meine Lösung:

bankq ist die Quelle - also von welcher Bank komme ich (hier im Beispiel Bank3) bankz ist das Ziel - also in welcher Bank (hier Bank1) soll das Unterprogramm ausgeführt werden

Man geht über eine Brücke im Hauptprogramm außerhalb der Banks... die Brücke liegt also außerhalb $4000-$7FFF

die Brücke sieht folgendermaßen aus:

            .proc banksw

            lda bankz
            sta portb           
ladenjsr        jsrziel = *+1           
            jsr $ffff   
            lda bankq
            sta portb
            rts

            .endp

Der Aufruf von BankX eines Codes in BankY:

            lda #$cb        ;der Aufruf kommt von Bank3
            sta bankq

            lda #$c3            ;Bank 1 ($c3) auswählen
            sta bankz
            mwa #beispiel banksw.jsrziel    ;hier wird jetzt jsr beispiel initialisiert
            jsr banksw                  ;Sprung zur Brücke, jsr beispiel wird in Bank1 ausgeführt, danach geht es zurück zum 
            .......                     ;zum Code in Bank3

... Verbesserungen oder alternative Ideen welcome !!

Gruß Peter

Idee: bankq auf den (Prozessor-) Stack legen statt in einer Speicherstelle speichern. Damit sind auch verschachtelte Aufrufe möglich. Wert für bankq nach der Rückkehr von Stack holen und die Bank umschalten.

https://mastodon.social/@cstrotm https://abbuc.social